home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
TECHNICA
/
COMPUTER
/
H254.ZIP
/
IRITSM3S.ZIP
/
CAGD_LIB
/
CAGD_WRT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-12-22
|
6KB
|
212 lines
/******************************************************************************
* Cagd_Wrt.c - Generic Curve/Surface writing to files. *
*******************************************************************************
* Written by Gershon Elber, July. 90. *
******************************************************************************/
#ifdef USE_VARARGS
#include <varargs.h>
#else
#include <stdarg.h>
#endif /* USE_VARARGS */
#include <string.h>
#include "cagd_loc.h"
static CagdPrintfFuncType RedirCagdPrintfFunc = NULL;
/*****************************************************************************
* Same as fprintf but with indentation. *
*****************************************************************************/
void CagdSetCagdFprintf(CagdPrintfFuncType Func)
{
RedirCagdPrintfFunc = Func;
}
/*****************************************************************************
* Same as fprintf but with indentation. *
*****************************************************************************/
#ifdef USE_VARARGS
void _CagdFprintf(FILE *f, int Indent, char *va_alist, ...)
{
static char AccumLine[LINE_LEN_LONG];
char *p, *Format, Line[LINE_LEN_LONG];
int i;
va_list ArgPtr;
va_start(ArgPtr);
Format = va_arg(ArgPtr, char *);
#else
void _CagdFprintf(FILE *f, int Indent, char *Format, ...)
{
static char AccumLine[LINE_LEN_LONG];
char *p, Line[LINE_LEN_LONG];
int i;
va_list ArgPtr;
va_start(ArgPtr, Format);
#endif /* USE_VARARGS */
vsprintf(Line, Format, ArgPtr);
va_end(ArgPtr);
if (RedirCagdPrintfFunc && f == NULL) {
for (i = 0, p = &AccumLine[strlen(AccumLine)];
i < Indent;
i++) *p++ = ' ';
*p = 0;
if ((p = strchr(Line, '\n')) != NULL ||
(p = strchr(Line, '\r')) != NULL)
*p = 0;
strcat(AccumLine, Line);
if (p != NULL) {
RedirCagdPrintfFunc(AccumLine);
AccumLine[0] = 0;
}
}
else {
for (i = 0; i < Indent; i++) fputc(' ', f);
fputs(Line, f);
}
}
/*****************************************************************************
* Generic routine to write curve(s) to the given file. *
( If Comment is NULL, no comment is printed, if "" only internal coment. *
*****************************************************************************/
int CagdCrvWriteToFile2(CagdCrvStruct *Crvs, FILE *f, int Indent, char *Comment,
char **ErrStr)
{
int RetVal = TRUE;
CagdCrvStruct *NextCrv;
for (; Crvs != NULL && RetVal; Crvs = Crvs -> Pnext) {
NextCrv = Crvs -> Pnext; /* To make sure we dump one at a time. */
Crvs -> Pnext = NULL;
switch(Crvs -> GType) {
case CAGD_CBEZIER_TYPE:
RetVal = BzrCrvWriteToFile2(Crvs, f, Indent, Comment, ErrStr);
break;
case CAGD_CBSPLINE_TYPE:
RetVal = BspCrvWriteToFile2(Crvs, f, Indent, Comment, ErrStr);
break;
case CAGD_CPOWER_TYPE:
FATAL_ERROR(CAGD_ERR_POWER_NO_SUPPORT);
return FALSE;
default:
FATAL_ERROR(CAGD_ERR_UNDEF_CRV);
return FALSE;
}
Crvs -> Pnext = NextCrv;
}
return RetVal;
}
/*****************************************************************************
* Generic routine to write surface(s) to the given file. *
( If Comment is NULL, no comment is printed, if "" only internal coment. *
*****************************************************************************/
int CagdSrfWriteToFile2(CagdSrfStruct *Srfs, FILE *f, int Indent, char *Comment,
char **ErrStr)
{
int RetVal = TRUE;
CagdSrfStruct *NextSrf;
for (; Srfs != NULL && RetVal; Srfs = Srfs -> Pnext) {
NextSrf = Srfs -> Pnext; /* To make sure we dump one at a time. */
Srfs -> Pnext = NULL;
switch (Srfs -> GType) {
case CAGD_SBEZIER_TYPE:
RetVal = BzrSrfWriteToFile2(Srfs, f, Indent, Comment, ErrStr);
break;
case CAGD_SBSPLINE_TYPE:
RetVal = BspSrfWriteToFile2(Srfs, f, Indent, Comment, ErrStr);
break;
case CAGD_SPOWER_TYPE:
FATAL_ERROR(CAGD_ERR_POWER_NO_SUPPORT);
return FALSE;
default:
FATAL_ERROR(CAGD_ERR_UNDEF_SRF);
return FALSE;
}
Srfs -> Pnext = NextSrf;
}
return RetVal;
}
/*****************************************************************************
* Generic routine to write curve(s) to the given file. *
( If Comment is NULL, no comment is printed, if "" only internal coment. *
*****************************************************************************/
int CagdCrvWriteToFile(CagdCrvStruct *Crvs, char *FileName, int Indent,
char *Comment, char **ErrStr)
{
int RetVal = TRUE;
CagdCrvStruct *NextCrv;
for (; Crvs != NULL && RetVal; Crvs = Crvs -> Pnext) {
NextCrv = Crvs -> Pnext; /* To make sure we dump one at a time. */
Crvs -> Pnext = NULL;
switch(Crvs -> GType) {
case CAGD_CBEZIER_TYPE:
RetVal = BzrCrvWriteToFile(Crvs, FileName, Indent, Comment, ErrStr);
break;
case CAGD_CBSPLINE_TYPE:
RetVal = BspCrvWriteToFile(Crvs, FileName, Indent, Comment, ErrStr);
break;
case CAGD_CPOWER_TYPE:
FATAL_ERROR(CAGD_ERR_POWER_NO_SUPPORT);
default:
FATAL_ERROR(CAGD_ERR_UNDEF_CRV);
return FALSE;
}
Crvs -> Pnext = NextCrv;
}
return RetVal;
}
/*****************************************************************************
* Generic routine to write surface(s) to the given file. *
( If Comment is NULL, no comment is printed, if "" only internal coment. *
*****************************************************************************/
int CagdSrfWriteToFile(CagdSrfStruct *Srfs, char *FileName, int Indent,
char *Comment, char **ErrStr)
{
int RetVal = TRUE;
CagdSrfStruct *NextSrf;
for (; Srfs != NULL && RetVal; Srfs = Srfs -> Pnext) {
NextSrf = Srfs -> Pnext; /* To make sure we dump one at a time. */
Srfs -> Pnext = NULL;
switch (Srfs -> GType) {
case CAGD_SBEZIER_TYPE:
RetVal = BzrSrfWriteToFile(Srfs, FileName, Indent, Comment, ErrStr);
break;
case CAGD_SBSPLINE_TYPE:
RetVal = BspSrfWriteToFile(Srfs, FileName, Indent, Comment, ErrStr);
break;
case CAGD_SPOWER_TYPE:
FATAL_ERROR(CAGD_ERR_POWER_NO_SUPPORT);
return FALSE;
default:
FATAL_ERROR(CAGD_ERR_UNDEF_SRF);
return FALSE;
}
Srfs -> Pnext = NextSrf;
}
return RetVal;
}